<?php
namespace App\Http\Controllers\Api;
use Mikecheng\Pay\Pay;
use Mikecheng\Pay\Log;
use Illuminate\Support\Facades\DB;
use Mikecheng\Pay\Exceptions\Exception;

class PayController extends Controller
{
    private $config;

    public function __construct()
    {
        $this->config = config('wxpay');

    }

    //统一下单
    public function index()
    {
        $order = [
            'out_trade_no' => $_POST['out_trade_no'], // 商户订单号
            'total_fee' => $_POST['total_fee'], // 支付金额，单位：分
            'body' => $_POST['body'], // 支付说明
            'openid' => $_POST['openid'], // 用户openid
            'notify_url' => 'http://wx.npnchina.com/wxServer/public/api/notify' //支付通知
        ];

        $pay = Pay::wechat($this->config)->mp($order);

        $arr = [
            "appId"=>$pay->appId,
            "timeStamp"=>$pay->timeStamp,
            "nonceStr"=>$pay->nonceStr,
            "package"=>$pay->package,
            "signType"=>$pay->signType,
            "paySign"=>$pay->paySign
        ];
        $recharge = new RechargeController();
        $recharge->createRechargeLog($_POST);
        return ['jsApiParameters'=>$arr, 'order'=>$order['out_trade_no']];
    }

    //付款异步通知
    public function notify()
    {
        $pay = Pay::wechat($this->config);

        try{
            $data = $pay->verify(); //支付通知验签
            //验签通过后的业务处理，以下为微信支付通知注意事项：
            /*
             * 注意：
             * 1、同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
             * 3、在订单状态不明或者没有收到微信支付结果通知的情况下，建议商户主动调用微信支付【查询订单API】确认订单状态。
             *
             * 特别提醒：
             * 2、当收到通知进行处理时，首先检查对应业务数据的状态，判断该通知是否已经处理过，如果没有处理过再进行处理，
             * 如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前，要采用数据锁进行并发控制，以避免函数重入造成的数据混乱。
             */
            Log::info('Sign Verify Successed[支付异步通知]:', $data->all());

            if($data['result_code']=='SUCCESS'){
                DB::table('tbl_product_recharge_log')->where('out_trade_no',$data['out_trade_no'])->update(['ti_pay_status'=>1]);
                Log::info('更新 tbl_product_recharge_log:', ['ti_pay_status:1']);
            } else {
                DB::table('tbl_product_recharge_log')->where('out_trade_no',$data['out_trade_no'])->update(['ti_pay_status'=>2]);
                Log::info('更新 tbl_product_recharge_log:', ['ti_pay_status:2']);
            }
        } catch (Exception $e) {
            //验证签名失败
            Log::info('Sign Verify Failed[支付异步通知]:', [$e->getMessage()]);
        }
        //返回结果
        return $pay->success();
    }



    //退款异步通知示例
    public function notifyRefund()
    {
        $pay = Pay::wechat($this->config);

        try{
            $data = $pay->verify(null, true); //退款通知验签
            //验签通过后的业务处理

            Log::info('Sign Verify Successed[退款异步通知]:', $data->all());
        } catch (Exception $e) {
            //验证签名失败
            Log::info('Sign Verify Failed[退款异步通知]:', [$e->getMessage()]);
        }

        return $pay->success();
    }

    //查询订单示例
    //$order对应商户订单号: "out_trade_no"
    //可以通过 $collection['xxx'] 访问服务器返回的数据。
    //具体返回数据参考微信支付查询订单接口
    public function find($order)
    {
//        $order = '1582188603';
        try{
            $colletion = Pay::wechat($this->config)->find($order);
            //查找到订单
        }catch (Exception $e){
            //无此订单
            $colletion = $e->raw;
        }

        return $colletion;
    }

    //退款订单示例
    //可以通过 $collection['xxx'] 访问服务器返回的数据。
    //具体返回数据参考微信支付申请退款接口
    public function refund()
    {
        $order = [
            'out_trade_no'=>'1582191208',   //对应商户订单号: "out_trade_no"
            'out_refund_no'=>time(),        //退款单号
            'total_fee'=>'1',               //支付金额
            'refund_fee'=>'1',              //退款金额
            'refund_desc'=>'商品已售完',     //退款原因
            'notify_url'=>'http://wx.npnchina.com/wx2/yyy'  //退款通知，可选
        ];

        try{
            $colletion = Pay::wechat($this->config)->refund($order);
            //退款请求被处理（被处理 != 退款成功，实际到账时间取决于用于支付方式：零钱或银行卡）
        }catch (Exception $e){
            //订单不符合退款要求
            $colletion = $e->raw;
        }

        return $colletion;
    }

    //关闭订单示例
    //$order对应商户订单号: "out_trade_no"
    //可以通过 $collection['xxx'] 访问服务器返回的数据。
    //具体返回数据参考微信支付关闭订单接口
    public function close($order)
    {
        try{
            $colletion = Pay::wechat($this->config)->close($order);
            //关闭订单成功
        }catch (Exception $e){
            //订单已不可关闭(如已支付、已退款)
            $colletion = $e->raw;
        }

        return $colletion;
    }
}
